#ifndef ROS_JSON_CONVERTER_H_
#define ROS_JSON_CONVERTER_H_

#include <jsoncpp/json/json.h>

#include <std_msgs/msg/int8.hpp>
// #include <std_msgs/msg/time.hpp>
#include <std_msgs/msg/color_rgba.hpp>

#include <geometry_msgs/msg/accel.hpp>
#include <geometry_msgs/msg/accel_stamped.hpp>
#include <geometry_msgs/msg/accel_with_covariance.hpp>
#include <geometry_msgs/msg/accel_with_covariance_stamped.hpp>
#include <geometry_msgs/msg/inertia.hpp>
#include <geometry_msgs/msg/inertia_stamped.hpp>
#include <geometry_msgs/msg/point.hpp>
#include <geometry_msgs/msg/point32.hpp>
#include <geometry_msgs/msg/point_stamped.hpp>
#include <geometry_msgs/msg/polygon.hpp>
#include <geometry_msgs/msg/polygon_stamped.hpp>
#include <geometry_msgs/msg/pose.hpp>
#include <geometry_msgs/msg/pose2_d.hpp>
#include <geometry_msgs/msg/pose_array.hpp>
#include <geometry_msgs/msg/pose_stamped.hpp>
#include <geometry_msgs/msg/pose_with_covariance.hpp>
#include <geometry_msgs/msg/pose_with_covariance_stamped.hpp>
#include <geometry_msgs/msg/quaternion.hpp>
#include <geometry_msgs/msg/quaternion_stamped.hpp>
#include <geometry_msgs/msg/transform.hpp>
#include <geometry_msgs/msg/transform_stamped.hpp>
#include <geometry_msgs/msg/twist.hpp>
#include <geometry_msgs/msg/twist_stamped.hpp>
#include <geometry_msgs/msg/twist_with_covariance.hpp>
#include <geometry_msgs/msg/twist_with_covariance_stamped.hpp>
#include <geometry_msgs/msg/vector3.hpp>
#include <geometry_msgs/msg/vector3_stamped.hpp>
#include <geometry_msgs/msg/wrench.hpp>
#include <geometry_msgs/msg/wrench_stamped.hpp>

#include <sensor_msgs/msg/joint_state.hpp>
#include <sensor_msgs/msg/channel_float32.hpp>
#include <sensor_msgs/msg/point_cloud.hpp>
#include <sensor_msgs/msg/laser_scan.hpp>

/*std_msgs/Int8*/
Json::Value std_msgsToJson(const std_msgs::msg::Int8 &msg);

/*std_msgs/Time*/
// Json::Value std_msgsToJson(const std_msgs::msg::Time &msg);

/*std_msgs/ColorRGBA*/
Json::Value std_msgsToJson(const std_msgs::msg::ColorRGBA &msg);

/*std/Header*/
Json::Value std_msgsToJson(const std_msgs::msg::Header &msg);

/*geometry_msgs/Accel*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Accel &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::AccelStamped &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::AccelWithCovariance &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::AccelWithCovarianceStamped &msg);

/*geometry_msgs/Inertia*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Inertia &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::InertiaStamped &msg);

/*geometry_msgs/Point*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Point &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Point32 &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::PointStamped &msg);

/*geometry_msgs/Polygon*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Polygon &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::PolygonStamped &msg);

/*geometry_msgs/Pose*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Pose &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Pose2D &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::PoseArray &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::PoseStamped &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::PoseWithCovariance &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::PoseWithCovarianceStamped &msg);

/*geometry_msgs/Quaternion*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Quaternion &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::QuaternionStamped &msg);

/*geometry_msgs/Transform*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Transform &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::TransformStamped &msg);

/*geometry_msgs/Twist*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Twist &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::TwistStamped &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::TwistWithCovariance &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::TwistWithCovarianceStamped &msg);

/*geometry_msgs/Vector3*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Vector3 &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Vector3Stamped &msg);

/*geometry_msgs/Wrench*/
Json::Value geometry_msgsToJson(const geometry_msgs::msg::Wrench &msg);
Json::Value geometry_msgsToJson(const geometry_msgs::msg::WrenchStamped &msg);

/*sensor_msgs/JointState*/
Json::Value sensor_msgsToJson(const sensor_msgs::msg::JointState &msg);
Json::Value sensor_msgsToJson(const sensor_msgs::msg::ChannelFloat32 &msg);
Json::Value sensor_msgsToJson(const sensor_msgs::msg::PointCloud &msg);
Json::Value sensor_msgsToJson(const sensor_msgs::msg::LaserScan &msg);

#endif // ROS_JSON_CONVERTER_H_